package org.moonlight.jvm.instructions.comparisons.dcmp;

import org.moonlight.jvm.instructions.base.NoOperandsInstruction;
import org.moonlight.jvm.rtda.exclusive.Frame;
import org.moonlight.jvm.rtda.exclusive.OperandStack;

/**
 * DCMP: dcmp指令用于比较 double变量
 * 由于浮点数计算有可能产生NaN（Not a Number）值，所以比较两个浮点数时，除了大于、等于、小于之外，还有第4种结果：无法比较。
 * dcmpg 和 dcmpl指令的区别就在于对第4种结果的定义。也就是说，当两个 double变量 中至少有一个是NaN时，
 * 用dcmpg指令比较的结果是1，而用dcmpl指令比较的结果是-1。
 *
 *
 * @author Moonlight
 * @createTime 2023/8/22 17:29
 **/
public abstract class DCmp extends NoOperandsInstruction {

    protected static void dCmp(Frame frame, boolean gFlag) {
        OperandStack stack = frame.getOperandStack();
        double a = stack.popDouble();
        double b = stack.popDouble();

        if (a > b) {
            stack.pushInt(-1);
        } else if (a == b) {
            stack.pushInt(0);
        } else if (a < b) {
            stack.pushInt(1);
        } else if (gFlag) {
            stack.pushInt(1);
        } else {
            stack.pushInt(-1);
        }
    }

}
